/**
 * @file 用户业务层
 * @version 1.0.0
 * @author qingxue
 * @createDate 2024-04-06 20:00
 * @updateDate 2024-04-06 20:00
 */

const { literal, Op, Sequelize } = require('sequelize');
const { User } = require('@/models/index');
const { ErrorMessage } = require('@/utils/response/error_message');
const { sign } = require('@/utils/permission/jwt');
const { encrypt, verify } = require('@/utils/permission/bcrypt');
const { now } = require('@/utils/moment');

/**
 * 新增用户信息
 * @param user 用户信息
 * @returns {Promise<*>} 新增结果
 */
const insertUser = async function (user) {
  try {
    user.password = encrypt(user.password); // 密码加密
    user.createTime = now(); // 创建时间
    user.updateTime = user.createTime; // 更新时间
    // 插入到数据表中
    return await User.create(user);
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 删除用户信息
 * @param id 用户 id
 * @returns {Promise<*>} // 删除结果
 */
const deleteUser = async function (id) {
  try {
    // 从数据表中删除
    return await User.destroy({where: {id}});
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 修改用户信息
 * @param user 用户信息
 * @returns {Promise<void>} // 修改结果
 */
const updateUser = async function (user) {
  user.updateTime = now(); // 更新时间
  try {
    // 在数据表中更新
    return await User.update(user, { where: { id: user.id } });
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 分页查询用户信息
 * @param uname 昵称
 * @param pageNum 页码
 * @param pageSize 每页条数
 * @returns {Promise<{rows: Model[], count: number}|{rows: Model[], count: GroupedCountResultItem[]}>} 用户分页信息
 */
const getUserByPage = async function (uname, pageNum, pageSize) {
  try {
    // 查询数据表中的数据
    return await User.findAndCountAll({
      where: {
        // 用户昵称模糊查询
        uname: {
          [Op.like]: `%${uname || ''}%`
        },
      },
      order: [['createTime', 'desc']], // 按创建时间降序排序
      limit: pageSize || 10, // 每页条数
      offset: ((pageNum || 1) - 1) * (pageSize || 10), // 当前页码
    });
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 获取所有用户信息
 * @returns {Promise<Model[]>} 所有用户信息
 */
const getAllUser = async function () {
  try {
    // 获取数据表中的所有数据
    return await User.findAll();
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 根据查询条件查询单个用户信息
 * @param map 查询条件
 * @returns {Promise<Model|null>} 用户信息
 */
const getUser = async function (map) {
  try {
    // 从数据表获取1条数据
    return await User.findOne({
      where: map
    });
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

/**
 * 登录
 * @param account 账号
 * @param password 密码
 * @returns {Promise<{}>} 登录信息
 */
const login = async function (account, password) {
  try {
    // 查询用户信息
    const user = await getUser({account});
    // 判定用户是否存在
    if (!user) {
      throw ErrorMessage.UserNotFoundError;
    }
    // 判断密码是否正确
    if (!verify(password, user['password'])) {
      throw ErrorMessage.PasswordError;
    }
    // 生成 token
    const token = sign(user['id']);
    return {
      user,
      token
    };
  } catch (error) {
    if (error.tag === 'custom') {
      throw {
        message: error,
        data: null
      };
    } else {
      throw {
        message: ErrorMessage.DataBaseError,
        data: error
      };
    }
  }
};

/**
 * 注册
 * @param user 用户信息
 * @returns {Promise<*>} 注册信息
 */
const register = async function (user) {
  user.permission = 1; // 注册的用户权限为1级
  // 新增用户信息
  return await insertUser(user);
};

/**
 * 根据用户 id 查询用户权限等级
 * @param id 用户 id
 * @returns {Promise<Model|null>} 用户权限等级
 */
const getUserPermissionById = async function (id) {
  try {
    // 根据用户 id 查询用户权限等级
    return (await User.findOne({
      attributes: ['permission'],
      where: {
        id
      }
    })).permission;
  } catch (error) {
    throw {
      message: ErrorMessage.DataBaseError,
      data: error
    };
  }
};

module.exports = { insertUser, deleteUser, updateUser, getUserByPage, getAllUser, getUser, login, register, getUserPermissionById };
